/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import controlador.Controlador;
import java.io.*;
import java.util.ArrayList;
import javax.swing.SwingUtilities;
import modelo.ModeloDatos;
import modelo.ModeloExperimento;
import modelo.ModeloGrafica;
import ui.Experimento;
import ui.PanelDatos;
import ui.Poblacion;
import ui.Tabla;

/**
 *
 * @author juanan
 */
public class InterfazFormatosCSVImplementation implements InterfazFormatos {

    private File ruta;
    private ModeloGrafica m;
    private ModeloDatos modeloDatos;
    private ModeloExperimento modeloExperimento;
    int fechaInicio, fechaFin;

    //private InterfazFormatosFileImplementation instance;

    // public static void
    @Override
    public void abrir(String nombre, Experimento experimento) {
        AbrirThread abrir = new AbrirThread(nombre, experimento);
        abrir.start();
    }

    @Override
    public void escribir(String nombre, Experimento experimento) {
        EscribirThread escribir = new EscribirThread(nombre, experimento);
        escribir.start();

    }

    private class AbrirThread extends Thread {

        String nombre;

        private AbrirThread(String nombre, Experimento experimento) {
            this.nombre = nombre;
        }

        @Override
        public void run() {

            FileReader fr = null;
            BufferedReader br = null;
            int index, alimentoInicial, diaAlimentoMax, alimentoMax, alimentoFinal, temperatura, tipoTemperatura, tamanhoInicial, luminosidad;
            String linea;
            final ArrayList<ModeloGrafica> listaModelosGrafica = new ArrayList<ModeloGrafica>();
            final ArrayList<ModeloDatos> listaModelosDatos = new ArrayList<ModeloDatos>();



            ruta = new File(nombre);

            int numFicheros = ruta.list().length;

            try {


                for (int i = 0; i < numFicheros - 1; i++) {
                    try {
                        m = new ModeloGrafica();
                        modeloDatos = new ModeloDatos();
                        modeloExperimento = new ModeloExperimento();

                        fr = new FileReader(ruta.getAbsolutePath() + "/nomfich" + (i + 1));
                        br = new BufferedReader(fr);
                        linea = br.readLine();
                        index = linea.indexOf(";");
                        String aux = linea.substring(index + 1);
                        alimentoInicial = Integer.parseInt(aux);

                        linea = br.readLine();
                        index = linea.indexOf(";");
                        aux = linea.substring(index + 1);
                        diaAlimentoMax = Integer.parseInt(aux);

                        linea = br.readLine();
                        index = linea.indexOf(";");
                        aux = linea.substring(index + 1);
                        alimentoMax = Integer.parseInt(aux);

                        linea = br.readLine();
                        index = linea.indexOf(";");
                        aux = linea.substring(index + 1);
                        alimentoFinal = Integer.parseInt(aux);

                        linea = br.readLine();
                        index = linea.indexOf(";");
                        aux = linea.substring(index + 1);
                        fechaInicio = Integer.parseInt(aux);

                        linea = br.readLine();
                        index = linea.indexOf(";");
                        aux = linea.substring(index + 1);
                        fechaFin = Integer.parseInt(aux);

                        linea = br.readLine();
                        index = linea.indexOf(";");
                        aux = linea.substring(index + 1);
                        temperatura = Integer.parseInt(aux);

                        linea = br.readLine();
                        index = linea.indexOf(";");
                        aux = linea.substring(index + 1);
                        tamanhoInicial = Integer.parseInt(aux);

                        linea = br.readLine();
                        index = linea.indexOf(";");
                        aux = linea.substring(index + 1);
                        luminosidad = Integer.parseInt(aux);

                        m.setAlimentoMax(alimentoMax);
                        m.setDiaAlimentoMax(diaAlimentoMax);
                        m.setAlimentoInicial(alimentoInicial);
                        m.setAlimentoFinal(alimentoFinal);

                        modeloDatos.setLuminosidad(luminosidad);
                        modeloDatos.setTamañoInicial(tamanhoInicial);
                        modeloDatos.setDate1(fechaInicio);
                        modeloDatos.setDate2(fechaFin);
                        modeloDatos.setTemperatura(temperatura);

                    } catch (Exception err) {
                        System.out.println(err);
                    } finally {
                        try {
                            if (null != br) {
                                br.close();
                            }
                            if (null != fr) //@Abraham Dependiendo del flujo de ejecucion podríamos no llegar aquí
                            {
                                fr.close();
                            }
                        } //@Abraham no captores Excepciones Runtime
                        catch (Exception e2) {
                            e2.printStackTrace();
                        }
                    }
                    listaModelosGrafica.add(m);
                    listaModelosDatos.add(modeloDatos);
                }

            } //@Abraham no captores Excepciones Runtime
            catch (Exception ex) {
                ex.printStackTrace();
            } finally {
                try {
                    if (null != br) {
                        br.close();
                    }
                    if (null != fr) //@Abraham Dependiendo del flujo de ejecución podríamos no llegar aqu
                    {
                        fr.close();
                    }
                } catch (IOException e2) {
                    e2.printStackTrace();
                }
            }
            SwingUtilities.invokeLater(new Runnable(){

                @Override
                public void run() {
                    Controlador.getInstance().abierto(listaModelosGrafica, listaModelosDatos);
                }
            });
            



        }
    }

    private class EscribirThread extends Thread {

        String ruta;
        private Experimento experimento;

        //TODO Acabar run
        private EscribirThread(String ruta, Experimento experimento) {
            this.ruta = ruta;
            this.experimento = experimento;

        }

        @Override
        public void run() {

            FileWriter ficheroPob = null;
            FileWriter ficheroExp = null;
            PrintWriter pw = null;
            PrintWriter pw2 = null;
            Tabla tabla = new Tabla();
            File rutaFich = new File(ruta);

    
            boolean creado = rutaFich.mkdir();

            if (creado) {
                int numFichas = experimento.getTabPane().getTabCount();

                for (int i = 0; i < numFichas; i++) {
                    try {
                        Poblacion p = (Poblacion) experimento.getTabPane().getComponentAt(i);

                        m = p.getM();
                        modeloDatos = p.getmDatos();
                        modeloExperimento = p.getmExperimento();

                        ficheroPob = new FileWriter(rutaFich.getAbsolutePath() + "/nomfich" + (i + 1));
                        pw = new PrintWriter(ficheroPob);

                        pw.println("AlimentoInicial" + ";" + m.getAlimentoInicial());
                        pw.println("DiaAlimentoMax" + ";" + m.getDiaAlimentoMax() / 10);
                        pw.println("AlimentoMax" + ";" + m.getAlimentoMax());
                        pw.println("AlimentoFinal" + ";" + m.getAlimentoFinal());
                        pw.println("FechaInicio" + ";" + modeloDatos.getDate1());
                        pw.println("FechaFin" + ";" + modeloDatos.getDate2());
                        pw.println("Temperatura" + ";" + modeloDatos.getTemperatura());
                        pw.println("TamanhoInicial" + ";" + modeloDatos.getTamañoInicial());
                        pw.println("Luminosidad" + ";" + modeloDatos.getLuminosidad());
                        for (int filaActual = 0; filaActual < 40; filaActual++) {
                            for (int columnaActual = 1; columnaActual < 4; columnaActual++) {
                                if (columnaActual != 3) {
                                    pw.print(tabla.getModel().getValueAt(filaActual, columnaActual) + ";");
                                } else {
                                    pw.println(tabla.getModel().getValueAt(filaActual, columnaActual));
                                }
                            }
                        }
                    } catch (Exception error) {
                        error.printStackTrace();
                    } finally {
                        if (null != ficheroPob) {
                            try {
                                ficheroPob.close();
                            } catch (IOException ex) {
                                System.out.println(ex);
                            }
                        }
                        if (null != pw) {
                            pw.close();
                        }
                    }

                }
                try {

                    ficheroExp = new FileWriter(rutaFich.getAbsolutePath() + "/datosExp");
                    pw2 = new PrintWriter(ficheroExp);
                    pw2.println("Investigador;" + modeloExperimento.getInvestigador());
                    pw2.println("TipoBacteria;" + modeloExperimento.getTipoBacteria());
                    pw2.println("Proyecto;" + modeloExperimento.getProyecto());
                } catch (IOException ex) {
                    System.out.println(ex);
                } finally {
                    try {
                        if (null != ficheroExp) {
                            ficheroExp.close();
                        }
                        if (null != pw2) {//@Abraham Dependiendo del flujo de ejecución podra no cerrarse
                            pw2.close();
                        }
                    } //@Abraham no captores Excepciones Runtime
                    catch (Exception e2) {
                        System.out.println(e2);
                    }
                }

            }
        }
    }
}
